package com.cw.reflect2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
            InvocationTargetException, InstantiationException, IllegalAccessException {
/*      Class类中用于获取构造方法的方法
              Constructor<?>[] getConstructors()
              Constructor<?>[] getDeclaredConstructors()
              Constructor<T>[] getConstructor(Class<?>... parameterTypes)
              Constructor<?>[] getDeclaredConstructor(Class<?>... parameterTypes)

        Constructor类中用于创建对象的方法
                T newInstance(Object... initargs)
        setAccessible(boolean flag)*/

        // 1.获取class字节码文件对象
        Class clazz = Class.forName("com.cw.reflect2.Student");

        // 2.获取构造方法
        System.out.println("获取public公共构造方法对象的数组=====================");
        // 获取public公共构造方法对象的数组
        Constructor[] cons = clazz.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }

        System.out.println("获取所有构造方法对象的数组=====================");

        // 获取所有构造方法对象的数组
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

        System.out.println("获取单个公共构造方法=====================");
        // 获取单个公共构造方法
        Constructor constructor = clazz.getConstructor(String.class);
        System.out.println(constructor);

        System.out.println("获取单个任意类型构造方法=====================");
        // 获取单个任意类型构造方法
        Constructor declaredConstructor1 = clazz.getDeclaredConstructor(int.class);
        System.out.println(declaredConstructor1);

        System.out.println("获取单个任意类型构造方法(形参如若有多个应注意先后顺序)=====================");
        // 获取单个任意类型构造方法(形参如若有多个应注意先后顺序)
        Constructor declaredConstructor2 = clazz.getDeclaredConstructor(String.class,int.class);
         System.out.println(declaredConstructor2);

        System.out.println("获取构造方法权限修饰符=====================");
        int modifiers = declaredConstructor2.getModifiers();// 获取构造方法权限修饰符
        System.out.println(modifiers);

        System.out.println("获取构造方法形参=====================");
        // 获取构造方法形参
        Parameter[] parameters = declaredConstructor2.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        //此处无法调用private修饰的构造方法
        /*<no parameters>
        String name
        int age*/
        Student stu = new Student();

        System.out.println("暴力反射：表示临时取消权限校验(可临时使用私有方法创建对象)=====================");
        // 暴力反射：表示临时取消权限校验(可临时使用私有方法创建对象)
        declaredConstructor2.setAccessible(true);
        Student s = (Student) declaredConstructor2.newInstance("lzx", 18);
        System.out.println(s);
    }
}